package Controlador;
import java.util.ArrayList;
import java.util.List;
import java.awt.Window;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowEvent;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.util.Iterator;

import Vista.VistaMenu;
import Vista.VistaOrden;
import Vista.VistaCliente;
import Modelo.Cliente;
import Modelo.Ingrediente;
import Modelo.IngredienteporProducto;
import Modelo.Orden;
import Modelo.DetalleOrden;

import Modelo.Accion;
import Modelo.Producto;


public class CntrlOrden implements ActionListener,ItemListener{
	
	VistaOrden vistaOrden;
	
	Accion accion=new Accion();
	private Vector<DetalleOrden> detalle;
	DetalleOrden detalleorden;
	Producto producto;
	List<Ingrediente> listaIngrediente=new ArrayList<Ingrediente>();
	
	
	
	public CntrlOrden(VistaOrden vistaorden)
	{
		vistaOrden=vistaorden;
		detalle=new Vector<DetalleOrden>();
		
		
	}
	

	public void actionPerformed(ActionEvent ae) {
		String opcion=(String)ae.getActionCommand();
		if(opcion.equals("Buscar")){
			boolean encontrado;
			Cliente cliente;
			encontrado=accion.consultarCliente(vistaOrden.txtCedula.getText());
			
		    if(encontrado){
		    	
		    cliente=accion.ObtenerCliente(vistaOrden.txtCedula.getText());
		    vistaOrden.txtNombre.setText(cliente.getNombre());
		    vistaOrden.txtApellido.setText(cliente.getApellido());
		    vistaOrden.txtTelefono.setText(cliente.getTelefono());
		    vistaOrden.txtDireccion.setText(cliente.getDireccion());
		     activar();
		    }
		    else{
		    	JOptionPane.showMessageDialog(null, "EL CLIENTE NO SE ENCUENTRA REGISTRADO", 
						"REGISTRO CLIENTE", 
						JOptionPane.INFORMATION_MESSAGE);
		    	
		    	int opc = JOptionPane.showConfirmDialog(new JFrame(),"Desea registrar el cliente?",
		   		     "Mensaje de Confirmacion",JOptionPane.YES_NO_OPTION,
		   		     JOptionPane.QUESTION_MESSAGE);
		                 if (opc == JOptionPane.YES_OPTION)
		                 {
		                	  VistaCliente vistaCliente=new VistaCliente();
		                	  vistaCliente.setVisible(true); 
		                 }
		   	    
		    	activar();
		    }
		    
		}
		
		
		if(opcion.equals("Registrar Orden")){
			boolean valida=false;
			valida=validarCampos();
			
			if(valida){
			  Orden orden= new Orden(vistaOrden.txtCodOrden.getText(),vistaOrden.txtFecha.getText(),vistaOrden.txtCedula.getText(),Float.parseFloat(vistaOrden.txtMontoT.getText()));
		      accion.registrarOrden(orden);
		      accion.registrarDetalle(detalle);
		      detalle.clear();
		      JOptionPane.showMessageDialog(null, "LA ORDEN HA SIDO REGISTRADA", 
					"REGISTRO ORDEN", 
					JOptionPane.INFORMATION_MESSAGE);
		      
			}		
		    else{
		    	
		    	JOptionPane.showMessageDialog(null, "DEBE LLENAR TODOS LOS CAMPOS DE LA ORDEN", 
						"REGISTRO ORDEN", 
						JOptionPane.INFORMATION_MESSAGE);
		    	
		    }
		}
		
		if(opcion.equals("Agregar")){
			boolean encontrado,agotado=false;
			float existenciaActual,total=0;
			String cantidad=vistaOrden.txtCantidad.getText();
			
			String nombre=vistaOrden.cmbProductos.getSelectedItem().toString();
			if(nombre.equals("Seleccione una Categoria") || nombre.equals("No tiene productos") || cantidad.equals(""))
				JOptionPane.showMessageDialog(new JFrame(), 
						"Fijese que halla seleccionado una categoria,producto y/o cantidad asignado una cantidad","Orden", 
						JOptionPane.INFORMATION_MESSAGE);
			else
			{
			int cantidadPedida=Integer.parseInt(vistaOrden.txtCantidad.getText());
			String codProducto=accion.obtenerCodProducto(vistaOrden.cmbProductos.getSelectedItem().toString());
			List<IngredienteporProducto> listaDetalleProducto=accion.cargarIngredientesPorProductosCod(codProducto);
			Iterator<IngredienteporProducto> iterador1=listaDetalleProducto.iterator();
			Ingrediente ingrediente1,ingrediente2;
			IngredienteporProducto detalleProducto;
			if(!listaIngrediente.isEmpty()){
				Iterator<Ingrediente> iterador2=listaIngrediente.iterator();
				agotado=false;
				while(iterador1.hasNext()){
					encontrado=false;
					detalleProducto=iterador1.next();
					float cantidadTotal=cantidadPedida*detalleProducto.getCantidadIngrediente();
					ingrediente1=accion.ObtenerIngrediente(detalleProducto.getCodingrediente());
					for (int i=0;i<listaIngrediente.size();i++){
						ingrediente2=listaIngrediente.get(i);
						if(ingrediente2.getCodigoIngrediente().compareTo(ingrediente1.getCodigoIngrediente())==0){
							if(cantidadTotal>ingrediente2.getCantidad()){
								JOptionPane.showMessageDialog(new JFrame(), 
										"No se puede realizar el pedido por falta de '"+ingrediente1.getNombreIngrediente()+"'","Orden", 
										JOptionPane.INFORMATION_MESSAGE);
								agotado=true;
							}
							else{
								existenciaActual=ingrediente2.getCantidad()-cantidadTotal;
								ingrediente2.setCantidad(existenciaActual);
						           }
							encontrado=true;
					     }		
				}
				if(!encontrado){
					    if(cantidadTotal>ingrediente1.getCantidad()){
							JOptionPane.showMessageDialog(new JFrame(), 
									"No se puede realizar el pedido por falta de '"+ingrediente1.getNombreIngrediente()+"'","Orden", 
									JOptionPane.INFORMATION_MESSAGE);
					    agotado=true;}
						    else{
						       ingrediente1.setCantidad(ingrediente1.getCantidad()-cantidadTotal);
						        listaIngrediente.add(ingrediente1);
						        }
				                 }	
				}
				}	
			else{
				for(int i=0;i<listaDetalleProducto.size();i++){
					detalleProducto=listaDetalleProducto.get(i);
					float cantidadTotal=cantidadPedida*detalleProducto.getCantidadIngrediente();
					ingrediente1=accion.ObtenerIngrediente(detalleProducto.getCodingrediente());
					if(cantidadTotal>ingrediente1.getCantidad()){
						JOptionPane.showMessageDialog(new JFrame(), 
								"No se puede realizar el pedido por falta de '"+ingrediente1.getNombreIngrediente()+"'","Orden", 
								JOptionPane.INFORMATION_MESSAGE);
					agotado=true;}
					else{
					ingrediente1.setCantidad(ingrediente1.getCantidad()-cantidadTotal);
				    listaIngrediente.add(ingrediente1);
					}
			
				}
		}
			
			DetalleOrden detalleOrden;
			if(!agotado){
			
			
			
			String codProd=accion.obtenerCodProducto(vistaOrden.cmbProductos.getSelectedItem().toString());
			DetalleOrden detalleprod=new DetalleOrden(vistaOrden.txtCodOrden.getText(),codProd,Integer.parseInt(vistaOrden.txtCantidad.getText())); 
			
			
			
			String nombreProd=vistaOrden.cmbProductos.getSelectedItem().toString();
			vistaOrden.listaModel.addElement(detalleprod.getCodProducto()+"  "+nombreProd+"  "+detalleprod.getCantidad());
			detalle.add(detalleprod);
			
			producto=accion.ObtenerProducto(codProd);
			float totalActual=Float.parseFloat(vistaOrden.txtMontoT.getText());
			total=total+(producto.getPrecio()*cantidadPedida);
			vistaOrden.txtMontoT.setText(String.valueOf(total+totalActual));
			
		    JOptionPane.showMessageDialog(null, "EL PRODUCTO HA SIDO AGREGADO", 
					"REGISTRO ORDEN", 
					JOptionPane.INFORMATION_MESSAGE);
			
		}
			
				
				
	}
				
	}		
			
			
	

				
		/*if(opcion.equals("Buscar")){
			boolean encontrado;
			String cat=accion.ObtenerCodCategoria(vistaProd.cmbCategorias.getSelectedItem().toString());
			Producto producto= new Producto(vistaProd.txtCodigo.getText(),cat,vistaProd.txtNombre.getText(),Float.parseFloat(vistaProd.txtPrecio.getText()));
			
		    encontrado=accion.consultarProducto(vistaProd.txtCodigo.getText());
		      if(encontrado){
		    	  producto=accion.ObtenerProducto(vistaProd.txtCodigo.getText());
		    	  vistaProd.txtNombre.setText(producto.getNombreProducto());
		  
		    }
		    else{
		    	JOptionPane.showMessageDialog(null, "El Producto no ha sido registrado", 
						"REGISTRO Producto", 
						JOptionPane.INFORMATION_MESSAGE);
		    	vistaProd.btnRegistrar.setEnabled(true);
		    }
		}*/
		/*if(opcion.equals("Modificar")){
			String cat=accion.ObtenerCodCategoria(vistaProd.cmbCategorias.getSelectedItem().toString());
			Producto producto= new Producto(vistaProd.txtCodigo.getText(),cat,vistaProd.txtNombre.getText(),Float.parseFloat(vistaProd.txtPrecio.getText()));
		   accion.modificarProducto(vistaProd.txtCodigo.getText(),producto);
		   JOptionPane.showMessageDialog(null, "El Producto ha sido modificado ", 
					"REGISTRO Producto", 
					JOptionPane.INFORMATION_MESSAGE);
		}
		if(opcion.equals("Eliminar")){
		    accion.eliminarProducto(vistaProd.txtCodigo.getText());
		    JOptionPane.showMessageDialog(null, "El Producto ha sido eliminado", 
					"REGISTRO Producto", 
					JOptionPane.INFORMATION_MESSAGE);
		}*/
		
		if(opcion.equals("Limpiar")){
			limpiar();
		}
		
		if(opcion.equals("    Salir   ")){
			vistaOrden.dispose();
		}
		
				
	}
	
	private boolean validarCampos(){
		boolean sw= false;
		if ((!vistaOrden.txtCodOrden.getText().equals("")) && (!vistaOrden.txtCedula.getText().equals("")) && (!vistaOrden.txtCantidad.getText().equals("")) && (!vistaOrden.txtMontoT.getText().equals("")))
		    sw=true;
		return sw;
		
	}

	private void limpiar() {
		vistaOrden.txtCodOrden.setEditable(true);
		//vistaOrden.btnBuscar.setEnabled(true);
		vistaOrden.txtCedula.setText("");
		vistaOrden.txtNombre.setText("");
		vistaOrden.txtApellido.setText("");
		vistaOrden.txtTelefono.setText("");
		vistaOrden.txtDireccion.setText("");
		vistaOrden.txtCodOrden.setText("");
		vistaOrden.txtCantidad.setText("");
		vistaOrden.txtMontoT.setText("");
		vistaOrden.listaModel.clear();
	}
	
	private void activar(){
		vistaOrden.txtNombre.setEnabled(true);
		vistaOrden.txtApellido.setEnabled(true);
		vistaOrden.txtTelefono.setEnabled(true);
		vistaOrden.txtDireccion.setEnabled(true);
	}
	
	@Override
	public void itemStateChanged(ItemEvent arg0) {
		vistaOrden.repaint();
		
	}
}	

